当前位置: 首页 > 面试题库 >

python将值分配给循环中的列表元素

秦诚
2023-03-14
问题内容

这是有效的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]

问题答案:

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

接下来,小数字(例如0和)1内部保存在小整数对象的池中(这是CPython实现的细节,不必是这种情况!)这就是为什么在foo为其分配ID后,ID相同的原因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

否则,这实际上是不可能的,因为一旦将列表的元素存储在变量中,就会有一个单独的引用,该引用未链接到存储在列表中的元素。并且由于大多数这些对象都是不可变的,并且在为变量分配新值时创建了一个新对象,因此您将无法获取列表的引用进行更新。



 类似资料:
  • 问题内容: 上面给我一个错误,即“一个”不存在。不能以这种方式分配吗?我想为列表中的每个var分配一个递增编号。 问题答案: Python变量是值的 名称 。他们并没有真正“包含”这些价值观。 导致“ var”成为列表中每个元素的名称。在循环内,它不会影响列表:相反,它将导致不再是list元素的名称,而是开始成为当前名称的名称。 同样,当你创建列表,如果,而不是已经为值的名字,那么你可以不使用它们

  • 实质上,我想命名列表的元素。 我可以这样做: 但是如果一个列表中有很多元素,那么这个过程会变得很长。 有没有更短的方法只命名一次散列?或许在此基础上有所变化: 但是使用来自函数<code>listmaker<code>的值?我在想象某种

  • 我有一个有4个不同数字的列表,总共10个数字。对于这些数字中的每一个,我想分配一个颜色/单词。因此,问题是,我如何从一个数字列表变成一个颜色列表,其中每个相同的数字都由相同的颜色/单词表示? 初步名单: 预期产出: 我尝试了什么? 我从我的_列表中提取了唯一编号: 现在,我需要从颜色列表中为这4个唯一的数字中的每一个分配一种颜色[‘红色’、‘蓝色’、‘绿色’、‘黑色’、‘黄色’、‘紫色’],然后用

  • 问题内容: 在Python中遍历列表时,如果没有列表理解,就无法修改元素。以供参考: 那么,为什么不能通过Python中的循环修改元素?肯定有一些我想念的东西,但是我不知道是什么。我确定这是重复的,但是我找不到与此相关的问题,如果有链接,那就绰绰有余了。 问题答案: 因为工作方式是这样的: 所以如果你给i它分配任何东西都不会影响。 解决方案是您所建议的,或者遍历索引: 或使用:

  • 问题内容: 我目前有一些这样的代码: 我想发生的事情是for循环迭代并用其对应的字母替换任何大于10的值。但是,我当前的代码只是更改,而不是列表中的原始值。例如,如果设置为15,则代码始终运行并设置为,但不会更改为,而是保持为15。如何解决此问题? 问题答案: 对于循环的每次迭代,变量只会被分配一个项的值的副本,因此对所做的更改将不会反映在。 您应该更新可以通过以下函数生成的via索引项:

  • 问题内容: 我正在使用while循环创建XML,但是现在我需要在生成的XML之前加上XML标头信息和包装器标签,但我正努力使其正常工作,这是我的代码, 我似乎找不到解决方法,我也尝试制作一个函数,但是效果并不理想,这里是代码, 提前感谢! 问题答案: 这是使用DOM的方法: 请注意,该函数希望您传递完整的结果数组,因此我可以使用以下方法进行测试: 该函数将返回 请注意,DOM自动为您转义了John