【问题标题】:Python std.stdout.write loop problemsPython std.stdout.write 循环问题
【发布时间】:2011-04-14 15:34:39
【问题描述】:

我不确定这里发生了什么,但我有一些 python 代码:

import sys

max_cols = 350
max_rows = 1
r1 = range(max_rows)
r2 = range(max_cols)

for y in r1:
    for x in r2:
        sys.stdout.write('something')
        if x is not max_cols-1:
            sys.stdout.write(',')

现在,这适用于 max_cols = 258,你最终会得到一个额外的 ','。 (这里的想法显然是生成一个 CSV 文件。)

现在,256 是一个 CS 编号,所以很明显这里发生了一些我不知道的事情,因为在那之前一切正常。当我尝试使用相同的模式写入文件时也会发生这种情况。

为什么会这样?

使用 Python 3.2。

【问题讨论】:

  • 我真的不会为此使用sys.stdout.write()
  • csv module 有什么问题吗?
  • print() 有什么问题?

标签: python python-3.x


【解决方案1】:

is 不是用于检查相等性,而是用于检查身份。 x is y 仅当两个变量都引用同一个对象时才为真。碰巧的是,CPython 将对象重用于小整数——但总的来说,身份的概念与相等的概念非常不同。使用正确的运算符 ==!= 分别表示相等和不等,它可以工作。

还请注意,只需使用csv module,代码就可以变得更加简单和健壮。无需重新发明轮子。

【讨论】:

  • 使用 != 有效,谢谢!我也不知道 csv 模块。
【解决方案2】:

CPython 实现缓存小数字,因此数字12 的所有实例都是同一个对象。 is 运算符比较对象的身份,而不是它们的值。您想要做的是使用 != 运算符来比较这些值。

您的 CPython 实现实例可能会缓存最多 256 个数字。

顺便说一句,每当您遇到这样的模式时,您必须从分隔的事物列表中删除最后一个分隔符,str.join 可能就是您想要的。

【讨论】:

  • .joinstr 的一个方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多