class 的实例是否立即在列表文字中创建?

Is an instance of a class created immediately inside a list literal?

我使用 __init__() 构造函数创建了两个简单的 classes,然后在列表中创建了它们的实例。

我很想知道简单地在列表中创建对象是否会实际创建该对象的实例 class,或者相反,是否仅当我们稍后引用该对象时(通过提及索引值) 创建了 class 个实例?

#First Class
class myClassOne(object):
  def __init__(self, a):
    self.a = a
  def __str__(self):
    return self.a

#Second class
class myClassTwo(object):
  def __init__(self, a):
    self.a = a
  def __str__(self):
    return self.a

#Instance of classes being called as an object inside the list
a = [1,2,3,myClassOne("hello"),myClassTwo("world"),"blah","blah"]
print(id(a[3]),id(a[4]))
print(a[3],a[4])

输出:

Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
140362290864536 140362290864592
hello world

您可以通过添加一些 print 语句轻松地进行测试:

class myClassOne:

    def __init__(self, a):
        self.a = a
        print("myClassOne instance created.")

    def __str__(self):
        return self.a


class myClassTwo:

    def __init__(self, a):
        self.a = a
        print("myClassTwo instance created.")

    def __str__(self):
        return self.a


print("Creating list 'a' ...")
a = [1, 2, 3, myClassOne("hello"), myClassTwo("world"), "blah", "blah"]
print("... list 'a' created.")

print("Printing ids ...")
print(id(a[3]), id(a[4]))
print("... ids printed.")

print("Printing items ...")
print(a[3], a[4])
print("... items printed.")

结果如下:

$ python3 hello.py 
Creating list 'a' ...
myClassOne instance created.
myClassTwo instance created.
... list 'a' created.
Printing ids ...
139953120034712 139953120034656
... ids printed.
Printing items ...
hello world
... items printed.

如您所见,实例是在创建列表的过程中创建的 a

情况总是如此:当您告诉 Python 做某事时,它会立即执行,无论该指令是构建列表还是某个类似对象的一部分。

请注意,告诉 Python 做某事(就像您正在创建该列表的情况)和告诉它 如何做某事(就像你定义myclassOne.__init__().

的情况一样

当您使用 def ... 块定义函数或方法时,您是在告诉 Python 如何 做某事,而它并没有在您调用该函数或方法之前,实际上已经完成了。

当您构建列表时,您是在告诉 Python 做某事,所以它会照做。