从C/C++之后学python, 很长一段时间没有注意过变量的问题。
一次, 写了一个循环,不断更新变量label, 再append给一个list.
label = 0 # 中间变量
list = [] # 列表
for i in range(5):
label = 5*i
list.append(label)
print list
输出为: [{'i': 25}, {'i': 25}, {'i': 25}, {'i': 25}, {'i': 25}]
期望输出[{'i': 5}, {'i': 10}, {'i': 15}, {'i': 20}, {'i': 25}]
源程序是Abaqus的数据,它的变量数组的形式更复杂,所以得到这个结果郁闷了好久,直到恍然间看到一个关于变量的帖子:
https://www.cnblogs.com/shizhengwen/p/6972183.html
才意识到是python内部机制的问题。
而类似的程序段:
label = 0 # 中间变量
list = [] # 列表
for i in range(5):
label = 5*i
list.append(label)
print list
输出确实是: [0 5 10 15 20]
是因为label=5*i相当于将label标签改变了新的位置,因此list.append每次操作的是新的label,也就不会发生内容冲突了。
因此,循环赋值何时会失败?——所有项目均赋值为最终项,
发生在更新中间变量时,只更新变量本身
python中一切都是对象。变量没有类型,其实是对象的一个标签(引用)。类型是属于对象的。
上述问题其实可以看做是python中变量的赋值(“=”)机制引起的。
list=[]
a=3 # 是给对象3一个标签a
b=a # 是给同一个对象3另一个标签b
list.append(b) # 将b指向的对象添加到列表list中
print list
# 输出
3
b=5
print list
# 输出
5
用copy()可以解决最初的问题,详细区别看如下:
https://www.cnblogs.com/awishfullyway/p/6031039.html
a = {"d": ["a", "1"], "age": 10}
b = a
c = a.copy()
from copy import deepcopy
d = deepcopy(a)
print "before:"
print "a:", a
print "b:", b
print "c:", c
print "d:", d
a["d"].append("c")
a["age"] = 11
print "after:"
print "a:", a
print "b:", b
print "c:", c
print "d:", d
#=>结果
before:
a: {'age': 10, 'd': ['a', '1']}
b: {'age': 10, 'd': ['a', '1']}
c: {'age': 10, 'd': ['a', '1']}
d: {'age': 10, 'd': ['a', '1']}
after:
a: {'age': 11, 'd': ['a', '1', 'c']}
b: {'age': 11, 'd': ['a', '1', 'c']}
c: {'age': 10, 'd': ['a', '1', 'c']}
d: {'age': 10, 'd': ['a', '1']}