【发布时间】:2017-08-21 16:19:28
【问题描述】:
所以前一周我通过运行实验注意到,尽管它是一种高级语言,但您可以通过像这样分配变量来复制变量:
a = 5
b = a
print(b) # 5
b = 3
print(b) # 3
print(a) # 5
...如果您以相同的方式处理字典或可能列出的列表,它就会失败!前一周我在我的代码中创建了一个错误,认为字典的工作方式相同。发现要制作正确的深层副本,您需要去:
b = dict(a)
无论如何,我正忙于处理日期时间对象,并且我正在像处理整数一样操纵它们,现在开始对这是否可行感到有些紧张。这一切似乎有点武断,它在哪里起作用,在哪里不起作用,我是否必须每次都运行一个实验来检查它的行为?可以猜测字符串可能像整数一样工作,但不确定行为在哪里发生变化。
对于 PHP 可以看到某人 has asked about 这个,但对于 Python,我倾向于认为 datetime 对象的任何分配都是正确的、深拷贝,并且永远不会意外地与原始变量混淆。有人有确切消息么?
【问题讨论】:
-
您可能会发现这很有帮助:Other languages have "variables", Python has "names"。有关此重要主题的更深入处理,请参阅由 SO 资深人士 Ned Batchelder 撰写的Facts and myths about Python names and values。
-
顺便说一句,
b = dict(a)是浅拷贝,你也可以做b = a.copy()。b = a不是复制,它只是将名称b绑定到也恰好绑定到名称a的 dict 对象。如果(绑定到的 dict 对象)a中的项目是不可变的,则浅拷贝就足够了,但如果不是,您可能需要深拷贝,您可以使用标准 @ 中的deepcopy函数来完成987654334@模块。 -
@PM2Ring 如果
b = dict(a)只是相当于b = a.copy()的浅拷贝,那么不知道为什么需要b = copy.deepcopy(a)无论如何,现在将继续使用我的日期时间的东西,可能需要有一天。感谢您的链接,是的,变量与名称。 -
@cardamom 尝试以下操作:
a = {1:'hi', 'u':[0,2]}b = dict(a)b['u'].append(77)c = copy.deepcopy(b)c['u'].append('oo')print(a, b, c)。结果:{1: 'hi', 'u': [0, 2, 77]} {1: 'hi', 'u': [0, 2, 77]} {1: 'hi', 'u': [0, 2, 77, 'oo']} -
@LucaCiti 我刚刚做了 - 这证明了
b = dict(a)不足以深度复制它,也许这介于深浅之间。需要import copy来运行它,但看起来这是正确的方法。
标签: python python-3.x datetime