Python 变量的实质,(赋值"="与copy(), )——为何循环赋值有时会失败,所有项目均赋值为最终项

xiaoxiao2021-07-05  314

从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的数据,它的变量数组的形式更复杂,所以得到这个结果郁闷了好久,直到恍然间看到一个关于变量的帖子:

Python 函数中,参数是传值,还是传引用?

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()可以解决最初的问题,详细区别看如下:

python中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']}

 

转载请注明原文地址: https://www.6miu.com/read-4821370.html

最新回复(0)