在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ Python中使用 [列表生成式] 創(chuàng)建類屬性失敗的問題

Python中使用 [列表生成式] 創(chuàng)建類屬性失敗的問題

在創(chuàng)建類時,遇到很奇怪的問題,主要原因是提示引用了不存在的變量,以下用具體代碼進(jìn)行說明.

class Stu_A(object):
    name='student{}'
    other_name=name.format('A')
    def __init__(self):
        pass
a=Stu_A()
print(a.other_name)

以上代碼是可以正確運(yùn)行的,但是如果再增加一個類屬性的話(該類屬性是以之前屬性格式化而生成的列表),就會提示變量沒有被定義的的錯誤,代碼如下:

class Stu_B(object):
    name='student{}'
    other_name=name.format('A')
    name_list = [name.format(i) for i in 'BCDE']
    def __init__(self):
        pass
    
b=Stu_B()
print(b.name_list)

Stu_B 這個類無法被創(chuàng)建

提示的錯誤信息: NameError: name 'name' is not defined

在Stu_A類中,other_name屬性同樣是用name屬性格式化而來的,可以正常運(yùn)行.

但在Stu_B中,使用一個列表生成式去格式化name屬性而創(chuàng)建一個列表,卻不行呢?

希望有大神能給解答一下,感謝!

回答
編輯回答
哎呦喂

在python3中:

[name.format(i) for i in 'BCDE']

等價于:

list(name.format(i) for i in 'BCDE')

這是一個函數(shù)調(diào)用。所以你如果要引用類屬性name作為函數(shù)的變量,應(yīng)該這樣:

[類名.name.format(i) for i in 'BCDE']
2017年6月10日 17:21
編輯回答
尛憇藌

我在python 2.7.15上運(yùn)行你的代碼,沒問題。python 3圖片描述沒試過。

2017年10月6日 07:42
編輯回答
慢半拍

正確的解釋請看這里 https://stackoverflow.com/que...

這個問題涉及到兩個知識點(diǎn):

  • Class Definition 的作用域是很特殊的,不會延伸至其內(nèi)部的其他作用域(函數(shù)、推導(dǎo)式、次級類定義)中
  • 在 Python 3 中,為了防止變量污染,推導(dǎo)式有自己的作用域

如果你非要這么做也不是不可以,使用 lambda 創(chuàng)建一個立即執(zhí)行函數(shù)就好了:

class A:
    x = 1
    y = (lambda x: [x for i in range(4)])(x)
2018年1月29日 15:33