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

从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']}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值