Python强制变量不通过引用传递

当声明超出范围时,Python 字典通过引用传递到列表中,使用a.append(b). 例如,以下代码:


my_dict = {}

my_list = []


for i in range(3):

    my_dict['id'] = str(i)

    my_list.append(my_dict)

    

my_list

返回 :


[{'id': '2'}, {'id': '2'}, {'id': '2'}]

如何通过以 pythonic 方式复制来传递它,而不将其声明到 for 循环中?如何在不重新创建变量的情况下强制变量不是对象引用?


DIEA
浏览 131回答 6
6回答

慕姐4208626

你只有一个字典,你不断覆盖它的键id,在循环中创建字典my_list = []for i in range(3):    my_dict = {}    my_dict['id'] = str(i)    my_list.append(my_dict) # can shorten in my_list.append({'id' : str(i)})    可以通过列表理解来缩短my_list = [{'id' : str(i)} for i in range(3)]

UYOU

理念:列表存储对对象 ( ) 的引用my_dict,因此无论何时更改其中的任何内容my_dict都会反映在列表 ( my_list)中代码:my_list = []for i in range(3):    my_list.append({'id' : str(i + 1)})    print(my_list)输出:[{'id': '1'}, {'id': '2'}, {'id': '3'}]

慕运维8079593

这是我的解决方案:my_list = []for i in range(1, 4): # If you put range(3), you'll get [{'id': '0'}, {'id': '1'}, {'id': '2'}]    my_dict = {}    my_dict['id'] = str(i)    my_list.append(my_dict)    print(my_list)更短的方法可能是:my_list = []for i in range(1, 4):    my_list.append({'id' : str(i)})print(my_list)

森林海

该my_dict实例是在 for 循环之外声明和分配的,因此您要添加到my_list字典的同一实例中。您需要为每个循环创建一个新的字典实例:my_list = []for i in range(3):    my_dict = {}    my_dict['id'] = str(i)    my_list.append(my_dict)这段代码有很多可能的优化方式:my_list = []for i in range(3):    my_list.append({'id': str(i)})最好的 pythonic 方式是列表理解:my_list = [{'id' : str(i)} for i in range(3)]

MM们

my_list = []for i in range(0,3):    my_dict = {} # making dictionary every time when running the loop.    my_dict['id'] = str(i) # assigning value    my_list.append(my_dict) #appending in list    my_list

慕尼黑的夜晚无繁华

是的,字典是通过引用传递的;所有对象都在 Python 中。横向当然是按价值传递的。如果将字典直接附加到列表中,代码可以按预期工作,如下所示:my_list = []for i in range(3):    my_list.append({'id': str(i)})可以按照@Yusef Maali 的建议进行改进:my_list = [{'id' : str(i)} for i in range(3)]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python