【问题标题】:In Python IDLE, what's the difference between 'print'ing a variable and just writing the variable?在 Python IDLE 中,“打印”变量和仅写入变量有什么区别?
【发布时间】:2011-12-23 22:00:38
【问题描述】:

在 IDLE 解释器中,我使用 dpkt 执行以下操作:

for ts, buf in pcap:
  eth = dpkt.ethernet.Ethernet(buf)

现在,当我尝试查看 'eth' 的内容时,我可以打印它,或者只写变量名。

当我这样做时:

print eth

我明白了:

O&áÿE(r @,òÀ¨
DYP?Jò}PªpÉ

但是,当我简单地写:

eth

我得到了更多预期的输出:

Ethernet(src='<removed>', dst='<removed>', data=IP(src='<removed>', off=16384, dst='<removed>', sum=11506, len=40, p=6, ttl=128, id=29344, data=TCP(seq=2527752393, ack=218580057, win=16202, sum=62077, flags=16, dport=80, sport=51626)))

所以我的问题是,做“打印(变量)”和只写变量名之间的根本区别是什么?如果我做一个简单的分配(即“x = 100”),“print x”和“x”都会得到“100”的结果

【问题讨论】:

标签: python variables printing python-idle


【解决方案1】:

print(variable) 等于 print(str(variable))

variable 等于 print(repr(variable))

我的猜测是dpkt.ethernet.Ethernet 类的__repr____str__ 方法会产生这些完全不同的结果。

更新:看看the source code 告诉我我是对的。

【讨论】:

  • 另一方面,我最初试图将“dpkt”标签添加到这个问题中,但由于它是一个新标签而无法添加,并且添加一个新标签需要 1500+ 信誉。看到您对我的问题的回答如何使您获得超过 1500 次代表,您能否在我的问题中添加“dpkt”标签(您是否觉得合适)?
  • 我觉得不合适。 str/repr 是纯pythonic,与dpkt 无关。您可以将问题改写为专门针对打印dpkt.ethernet.Ethernet 提出的问题,那么在我看来它可能是合适的...
  • 也许我们需要一个关于这个主题的规范问题——这样的问题有什么好的标准类吗?
  • None 值不是这种情况?对于 None 变量,键入该变量不会打印任何内容。然而print(repr(None)) 给了None。为什么?
【解决方案2】:

python中有两个函数可以将数据表示为字符串:repr()str()

当您使用print 语句时,会根据您为print 语句提供的任何参数调用str 函数(并在结果末尾附加一个换行符)。例如,x = 100; print x 将调用 str(x)。结果(“100”)将附加一个换行符,并将其发送到标准输出。

当您执行打印语句以外的内容时,解释器将打印表达式使用repr 产生的任何值,除非该值为None,在这种情况下不会打印任何内容。

在大多数情况下,两者之间只有细微的差别。然而,对象通常定义它们自己不同的__str____repr__ 方法(它们定义了该对象的strrepr 内置函数的行为)。在您的示例中,eth 对象的 __repr__ 方法必须与 __str__ 方法不同。

我推测__str__ 方法正在返回要通过网络发送的对象的二进制字符串表示,但我不能确定。

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2023-03-21
    • 1970-01-01
    • 2011-01-14
    • 2018-04-23
    相关资源
    最近更新 更多