日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python自定义变量名_Python 动态变量名定义与调用

發布時間:2024/1/23 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python自定义变量名_Python 动态变量名定义与调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態變量名賦值

在使用 tkinter 時需要動態生成變量,如動態生成 var1…var10 變量。

使用 exec 動態賦值

exec 在 python3 中是內置函數,它支持 python 代碼的動態執行。

for i in range(6):

exec('var{} = {}'.format(i,i))

print(var0,var1,var2,var3,var4,var5)

運行結果如下:

0,1,2,3,4,5

利用命名空間動態賦值

在 Python 的命名空間中,將變量名與值存儲在字典中,可以通過 locals(),globals() 函數分別獲取局部命名空間和全局命名空間。

names = locals()

for i in range(5):

names['n' + str(i)] = i

print(n0,n1,n2,n3,n4)

運行結果如下:

0 1 2 3 4

在類中使用動態變量

Python 的類對象的屬性儲存在的 dict 中。dict 是一個詞典,鍵為屬性名,值對應屬性的值。

class Test_class(object):

def __init__(self):

names = self.__dict__

for i in range(5):

names['n' + str(i)] = i

t = Test_class()

print(t.__dict__)

print(t.n0,t.n1,t.n2,t.n3,t.n4)

運行結果如下:

{'n0': 0, 'n1': 1, 'n2': 2, 'n3': 3, 'n4': 4}

0 1 2 3 4

利用 exec 函數

同樣地,可以使用 exec 調用變量

for i in range(5):

exec('var{} = {}'.format(i, i))

for i in range(5):

exec('print(var{},end=" ")'.format(i))

運行結果如下:

0 1 2 3 4

利用命名空間

因為命令空間的 locals() 與 globals() 均會返回一個字典,利用字典的 get 方法獲取變量的值。

for i in range(5):

exec('var{} = {}'.format(i, i))

names = locals()

for i in range(5):

print(names.get('var' + str(i)),end=' ')

運行結果如下:

0 1 2 3 4

你想在使用范圍內執行某個代碼片段,并且希望在執行后所有的結果都不可見。

>>> a = 14

>>> exec('b = a + 1')

>>> print(b)

15

在一個函數中執行同樣的代碼:(會發生錯誤)

>>> def test():

... a = 14

... exec('b = a + 1')

... print(b)

...

>>> test()

Traceback (most recent call last):

File "", line 1, in

File "", line 4, in test

NameError: global name 'b' is not defined

>>>

可以看出,最后拋出了一個NameError異常,就跟在 exec() 語句從沒執行過一樣。要是你想在后面的計算中使用到 exec() 執行結果的話就會有問題了。

為了修正這樣的錯誤,你需要在調用 exec() 之前使用 locals() 函數來得到一個局部變量字典。

之后你就能從局部字典中獲取修改過后的變量值了。例如:

>>> def test():

... a = 13

... loc = locals()

... exec('b = a + 1')

... b = loc['b']

... print(b)

...

>>> test()

14

>>>

注意點:

默認情況下,exec() 會在調用者局部和全局范圍內執行代碼。然而,在函數里面,傳遞給 exec() 的局部范圍是拷貝實際局部變量組成的一個字典。

因此,如果 exec() 如果執行了修改操作,這種修改后的結果對實際局部變量值是沒有影響的。

>>> def test1():

... x = 0

... exec('x += 1')

... print(x)

...

>>> test1()

0

上面代碼里,當你調用 locals() 獲取局部變量時,你獲得的是傳遞給 exec() 的局部變量的一個拷貝。

通過在代碼執行后審查這個字典的值,那就能獲取修改后的值了。

>>> def test2():

... x = 0

... loc = locals()

... print('before:', loc)

... exec('x += 1')

... print('after:', loc)

... print('x =', x)

...

>>> test2()

before: {'x': 0}

after: {'loc': {...}, 'x': 1}

x = 0

>>>

仔細觀察最后一步的輸出,除非你將 loc 中被修改后的值手動賦值給x,否則x變量值是不會變的。

在使用 locals() 的時候,你需要注意操作順序。每次它被調用的時候,locals() 會獲取局部變量值中的值并覆蓋字典中相應的變量。

>>> def test3():

... x = 0

... loc = locals()

... print(loc)

... exec('x += 1')

... print(loc)

... locals()

... print(loc)

...

>>> test3()

{'x': 0}

{'loc': {...}, 'x': 1}

{'loc': {...}, 'x': 0}

>>>

注意最后一次調用 locals() 的時候x的值是如何被覆蓋掉的。

作為 locals() 的一個替代方案,你可以使用你自己的字典,并將它傳遞給 exec() 。例如:

>>> def test4():

... a = 13

... loc = { 'a' : a }

... glb = { }

... exec('b = a + 1', glb, loc)

... b = loc['b']

... print(b)

...

>>> test4()

14

>>>

大部分情況下,這種方式是使用 exec() 的最佳實踐。你只需要保證全局和局部字典在后面代碼訪問時已經被初始化。

總結

以上是生活随笔為你收集整理的python自定义变量名_Python 动态变量名定义与调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。