python - 在计数器数组中使用 "+="导致意外行为,Python

标签 python operators

我正在使用Python 3.4.1,我想知道以下情况:

给定一个计数器数组

cnt = [Counter()] * n

我想在特定位置添加一些项目,所以我这样做了

cnt[i] += Counter(x)

对于构造“+=”,我正在尝试这样做

cnt[i] = cnt[i] + Counter(x)

但是,我收到的东西与我预期的不同,相当于

for i in range(0, n):
    cnt[i] = cnt[i] + Counter(x)

换句话说,它将我所有的计数器添加到数组中。

  • 这种行为(添加数组的每个项目)在 Python 中常见吗? 我解释有什么错误吗?
  • 有正确/简单/安全的方式来写我想要的内容吗?
  • 这是版本的错误吗?

一个简短的例子:

from collections import Counter

text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
cnt = [Counter()] * 2

i = 0
for c in text:
    cnt[i] += Counter(c)  # cnt[i] = cnt[i] + Counter(c)
    i = (i+1) % 2

for i in range(0, 2):
    print(cnt[i], i)

输出:

Counter({' ': 7, 'i': 6, 'e': 5, 't': 5, 'o': 4, 's': 4, 'm': 3, 'r': 3, 'c': 3, 'u': 2, 'p': 2, 'a': 2, 'l': 2, 'd': 2, 'n': 2, '.': 1, 'g': 1, 'L': 1, ',': 1}) 0
Counter({' ': 7, 'i': 6, 'e': 5, 't': 5, 'o': 4, 's': 4, 'm': 3, 'r': 3, 'c': 3, 'u': 2, 'p': 2, 'a': 2, 'l': 2, 'd': 2, 'n': 2, '.': 1, 'g': 1, 'L': 1, ',': 1}) 1

预期输出:

Counter({'t': 4, 'i': 3, 'r': 3, 's': 2, 'e': 2, 'm': 2, 'c': 2, 'n': 2, 'a': 2, 'l': 2, ',': 1, 'd': 1, ' ': 1, 'L': 1}) 0
Counter({' ': 6, 'o': 4, 'i': 3, 'e': 3, 's': 2, 'u': 2, 'p': 2, '.': 1, 't': 1, 'g': 1, 'd': 1, 'm': 1, 'c': 1}) 1

最佳答案

当您执行cnt = [Counter()] * n时,您所做的是创建一个计数器,然后使列表中的每个元素都指向该计数器。您没有创建n个计数器,而是创建一个计数器。

这是因为在 Python 中,所有内容都是通过引用存储的(有点。更多信息 here )。您实际上已经复制了对计数器对象的引用 n 次,而不是计数器本身。

这意味着执行 cnt[i] += Counter(x) 将修改底层计数器,使其看起来像是整个列表已更改。

要解决此问题,请尝试执行以下操作:

cnt = [Counter() for i in range(n)]

现在,您真正创建了 n 个不同的计数器(因为您调用了构造函数 n 次)并将获得预期的行为。

关于python - 在计数器数组中使用 "+="导致意外行为,Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25829972/

相关文章:

python - 如何在 PIL.ImageFont 中使用我自己的位图字体?

python - 从给定列表生成所有可能的 k-mers(字符串组合)

php - MySQL WHERE 条件是否将括号视为与 PHP 相同?

mysql - 使用 OR 和 NAND 选择查询

c++ - 为什么双向/正向运算符不支持不等式关系运算符?

python - matplotlib 注释 xycoords= ('data' ,'axes fraction' ) => TypeError : 'NoneType' object is not iterable

python - Mssql外键

python 日志记录根本不起作用

c# - 将 java 代码转换为 C#。运算符(operator)错误

json - Grails GSP安全导航运算符(operator)是否可以防御 “JSONObject$Null”?