- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我从 2 周前开始学习 python。但是我不明白为什么 copy_dic
是 {'a': 3}
。
保存内存地址??我不知道..
1:变量大小写
var_a = 1
copy_var = var_a
var_a = 3
print(copy_var)
# 1
2:字典格
dic = {'a':1}
copy_dic = dic
dic['a'] = 3
print(copy_dic)
# {'a': 3}
最佳答案
在 Python 中,名称只是对对象的引用。当你有这样的事情时:
var_a = 1
dic = {'a' : 1}
dic
和 var_a
只是指向各自对象的名称。
视觉呈现:
var_a --> 1
dic --> {'a' : 1}
当您使用 =
运算符分配一些其他变量时,您实际上是在要求其他变量指向完全相同的对象:
copy_var = var_a
copy_dic = dic
视觉呈现:
var_a --> 1 <-- copy_var
dic --> {'a' : 1} <-- copy_dic
现在,更改该对象会影响指向它的所有变量,如问题所示:
dic['a'] = 3
视觉呈现:
var_a --> 1 <-- copy_var
dic --> {'a' : 3} <-- copy_dic
可以看出,两个变量 (dic
, copy_dic
) 指向的单个 dict
对象被改变了,并且它们都仍然指向这个对象。
还有一个问题,“为什么更改 int
对象没有相同的效果?对 var_a
的操作不应该影响 copy_var
也是吗?”
答案是,在 Python 中,整数、字符串、元组和其他一些对象是不可变的,这意味着您无法更改它们。当您尝试更改整数时:
var_a = 3
或
var_a += 2
var_a
开始指向一个完全不同的整数对象。
视觉呈现:
var_a --> 3
1 <-- copy_var
dic --> {'a' : 3} <-- copy_dic
如果你想拥有单独的 dict
对象怎么办?您可以使用 copy方法:
dic = {'a':1}
copy_dic = dic.copy() # <-- notice `.copy` here
dic['a'] = 3
print(dic)
print(copy_dic)
输出:
{'a': 3}
{'a': 1}
copy
创建该对象的新副本并将其返回。
视觉表示:
var_a --> 3
1 <-- copy_var
dic --> {'a' : 1}
{'a' : 1} <-- copy_dic
注意:
copy()
Return a shallow copy of the dictionary.
什么是浅拷贝,有人可能会问。正如文档所述:
A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
这意味着 dict
对象是两个不同的对象,但它们的组件是相同的,因此如果它们的对象是可变的,并且您更改了它们,那仍然会影响另一个:
dic = {'a' : [1, 2]} # lists are mutable
copy_dic = dic.copy()
dic['a'].append("spam") # <-- alters the object both of the dictionaries hold a reference to
print(dic)
print(copy_dic)
输出:
{'a': [1, 2, 'spam']}
{'a': [1, 2, 'spam']}
如果您需要避免这种行为,您需要的是 deepcopy功能:
copy.deepcopy(x[, memo])
Return a deep copy of x.
如前所述:
A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.
意义字典包含对不同对象的引用。在这种情况下,您可以更改其中一个而不必担心另一个。这个函数可以在copy
模块中找到:
import copy # import this module for `deepcopy`
dic = {'a' : [1, 2]}
copy_dic = copy.deepcopy(dic)
dic['a'].append("spam")
print(dic)
print(copy_dic)
输出:
{'a': [1, 2, 'spam']}
{'a': [1, 2]}
但是,在大多数情况下,浅拷贝才是您真正需要的。
关于python - 为什么 print(copy_dic) 是 {'a' : 3}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53464742/
我是一名优秀的程序员,十分优秀!