【问题标题】:Same variable name for different types in PythonPython中不同类型的相同变量名
【发布时间】:2014-08-25 15:17:11
【问题描述】:

我发现自己经常做类似的事情:

msg = ['This', 'is', 'a', 'message']  # (or built up programmatically)
msg = ' '.join(msg)

这会将变量msg 的类型从list 更改为str,这对于像Python 这样的动态类型语言是允许的。不过,这是个好主意吗?这里没有太多的混淆,因为分配很接近,但是如果msg 以两种不同的形式在广泛分布的代码中使用呢?

【问题讨论】:

  • isinstance(msg,list) ?我认为这里没有问题。有时可能很难阅读,但我发现自己经常这样做。只要确保您使用正确的类型计数即可
  • 真正的问题是:为liststr 使用相同的标签有什么好处?
  • 为变量提供描述性名称对您非常有用,即使您需要额外的按键。
  • '.'.join('This is a message') == 'T.h.i.s. .i.s. .a. .m.e.s.s.a.g.e'
  • “改变变量的类型” 不。它没有。变量在 Python 中没有类型。它们只不过是指代内存中的对象的标签

标签: python dynamic-typing


【解决方案1】:

但是,如果 msg 以两种不同的形式在间隔很宽的代码中使用呢?

你一针见血。使用相同的参考名称只是增加了程序员在扫描代码时需要注意的一件事——仅出于这个原因,最好使用不同的名称。

我个人使用类似的东西:

msg = ['This', 'is', 'a', 'message']
msg_str = ' '.join(msg)

【讨论】:

  • 命名空间是一个很棒的主意
  • 我理解这样做的原因,但我想我不这样做的原因是,将类型名称附加到我的变量标识符上感觉不符合 Python 风格。我的意思是,如果变量名称要指示(但不强制)数据类型,为什么还要动态类型?
  • @user293594 您通常会避免在名称中使用类型。但在名称冲突的情况下,最好 (IMO) 附加类型。
【解决方案2】:

我的建议是,您只在代码中执行您真正打算执行的操作,而不是其他任何内容。如果您考虑一下您的示例,它实际上做了什么?

第一行接受一个值(特别是一个列表)并在其上放置一个标签,因为正如 Sylvain Leroux 在评论中提到的,这实际上是一个变量。然后,在第二行中,您使用该值创建另一个值(这次是一个字符串),然后——这是重要的部分——你从第一个值中取出标签并将其放在第二个值上。

这真的是你想做的吗?基本上,第一个值(列表)是您真正需要的最终值的一次性中间步骤,并在其工作完成时被丢弃。在这种特殊情况下,代码可以很容易地写成:

msg = ' '.join(['This', 'is', 'a', 'message'])

另一方面,如果您确实需要两个不同的值,一个基于另一个,在代码的其他地方独立使用,那么请务必按照 martin Konecny 的建议创建一个不同的变量名称。

这里重要的是要记住,变量实际上是应用于不同值的标签,并且可以从一个值移开并分配给另一个值。事实上,用几个不同的“标签”来“标记”一个值是很标准的。即为多个变量分配相同的值。这里重要的是值,而不是变量,它只是命名空间中的标签。

【讨论】:

  • 感谢您的回答。我了解变量、值和类型在 Python 中是如何工作的,所以我的问题实际上是一个关于风格的问题——我无法按照您建议的方式构建我的 msg str,因为它的片段(列表中的项目)可能是通过编程生成的.但是 msg 列表只是暂时的——我真的打算在构建 msg str 时把它扔掉。
  • 这就是为什么我说“在这种特殊情况下”,即书面。但相关的一点是价值是守门员还是一次性。
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
相关资源
最近更新 更多