gpt4 book ai didi

python - 为什么 print(copy_dic) 是 {'a' : 3}?

转载 作者:太空宇宙 更新时间:2023-11-03 15:39:27 25 4
gpt4 key购买 nike

我从 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}

dicvar_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com