python赋值给循环中的元素列表

 背着蜗牛过子mz 发布于 2023-02-09 10:26

这是一个有效的python行为吗?我认为最终结果应该是[0,0,0]并且id()函数应该在每次迭代时返回相同的值.如何使它成为pythonic,而不是使用枚举或范围(len(bar))?

bar = [1,2,3]
print bar
for foo in bar:
    print id (foo)
    foo=0
    print id(foo)
print bar

输出:

[1, 2, 3]
5169664
5169676
5169652
5169676
5169640
5169676
[1, 2, 3]

poke.. 21

首先,你不能重新分配循环变量,你可以,但这不会改变你迭代的列表.因此,设置foo = 0不会更改列表,而只会更改局部变量foo(恰好包含每次迭代开始时迭代的值).

接下来,小数字,像01内部保存在一个小整数对象池中(这是一个CPython实现细节,不一定是这种情况!)这就是为什么ID foo在分配0给它之后是相同的.id基本上0是池中整数对象的id .

如果要在迭代时更改列表,遗憾的是必须按索引访问元素.因此,如果您希望保持输出相同,但[0, 0, 0]最后,则必须迭代索引:

for i in range(len(bar)):
    print id(bar[i])
    bar[i] = 0
    print id(bar[i])
print bar

否则,它实际上是不可能的,因为只要将列表的元素存储在变量中,就会有一个单独的引用,它与列表中存储的链接无关.由于大多数这些对象都是不可变的,并且在为变量赋值时创建了新对象,因此您无法获得列表对更新的引用.

1 个回答
  • 首先,你不能重新分配循环变量,你可以,但这不会改变你迭代的列表.因此,设置foo = 0不会更改列表,而只会更改局部变量foo(恰好包含每次迭代开始时迭代的值).

    接下来,小数字,像01内部保存在一个小整数对象池中(这是一个CPython实现细节,不一定是这种情况!)这就是为什么ID foo在分配0给它之后是相同的.id基本上0是池中整数对象的id .

    如果要在迭代时更改列表,遗憾的是必须按索引访问元素.因此,如果您希望保持输出相同,但[0, 0, 0]最后,则必须迭代索引:

    for i in range(len(bar)):
        print id(bar[i])
        bar[i] = 0
        print id(bar[i])
    print bar
    

    否则,它实际上是不可能的,因为只要将列表的元素存储在变量中,就会有一个单独的引用,它与列表中存储的链接无关.由于大多数这些对象都是不可变的,并且在为变量赋值时创建了新对象,因此您无法获得列表对更新的引用.

    2023-02-09 10:30 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有