为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

DIEA 2023-03-16 10:04:47
当声明超出范围时,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 循环中?如何在不重新创建变量的情况下强制变量不是对象引用?
查看完整描述

6 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

你只有一个字典,你不断覆盖它的键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)]


查看完整回答
反对 回复 2023-03-16
?
UYOU

TA贡献1878条经验 获得超4个赞

理念:


列表存储对对象 ( ) 的引用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'}]


查看完整回答
反对 回复 2023-03-16
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

这是我的解决方案:


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)


查看完整回答
反对 回复 2023-03-16
?
森林海

TA贡献2011条经验 获得超2个赞

该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)]


查看完整回答
反对 回复 2023-03-16
?
MM们

TA贡献1886条经验 获得超2个赞

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


查看完整回答
反对 回复 2023-03-16
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

是的,字典是通过引用传递的;所有对象都在 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)]


查看完整回答
反对 回复 2023-03-16
  • 6 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信