python - 为什么你不必在 Python 中返回对象?
问题描述
我是 Python 和一般编程的新手,我刚刚进入 OOP。在 Python 中,函数命名空间中定义的任何内容仅在该命名空间内有效;一旦超出该空间,变量之类的东西就会被遗忘:
def foo():
a = 3
print(a)
NameError: name 'a' is not defined
据我所知,除了从函数返回数据外,函数内部的任何信息在函数调用结束时都会丢失,这就是我的问题。采取以下代码:
class Example:
def __init__(self, name):
self.name = name
def foo(self):
self.name = 'John'
bar = Example('Jake')
bar.foo()
print(bar.name)
'John'
我的问题是:为什么你不必在方法之后返回对象?在普通函数中,任何变量都会被遗忘,但在方法中,似乎数据实际上是附加到对象本身的,例如尽管首先在另一个方法中被引用,但该foo()
方法能够引用。这个对吗?还是有更好的技术解释?self.name
self.name
解决方案
首先,您不必在方法中返回值,而不是在 python 中,也不是在许多其他编程语言中。例如:
def append_a(lst):
lst.append('a')
bob = []
append_a(bob)
print(bob)
['a']
上面我们没有在函数中返回任何东西,但是我们使用它来修改现有的数据结构,这几乎在任何地方都很常见。
其次,在您的第二个示例中,您创建了类 Example 的实例,当您查看时,self.something
您正在查看该类的成员,这与其他语言不同,成员通常只声明一次,在 python 中,您可以动态添加成员。
因此,当bar.name
您查看类的成员时,它的值在 instance 上bar
。如果您查看不同的实例,则值将不同。
class Example:
def __init__(self, name):
self.name = name
def foo(self):
self.name = 'John'
bar = Example('Jake')
bob = Example('Bob')
bar.foo()
print(bar.name)
print(bob.name)
John
Bob
推荐阅读
- html - 如何在Django的每个页面的页脚中为约会表单创建视图
- mongodb - 使用 Rsyslog 发送到 Loggly 并清理 mongodb 日志数据
- r - 从单独列中的嵌套列表中获取值
- flutter - 在我的文本中显示来自 API 的信息时出现问题
- javascript - 为什么 let 和 var 在 JS 中的行为与 this 不同
- java - 如何将 JVM 选项添加到 PeopleCode 调用?
- python - 我可以使用 python 脚本在 android 终端模拟器中执行命令吗
- subdomain - 子域邮件转发 *@subdomain.mydomain.com
- linux - 当文件由用户“system”和组“system”拥有时,这意味着什么?在android文件系统中
- database - 实时数据库不写入来自 android studio 的数据