我以为我会'全球'但...... [英] I thought I'd 'got' globals but...

查看:54
本文介绍了我以为我会'全球'但......的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以为我已经''得到'全局,但这个看起来很奇怪。

我希望我的示例函数''doIt''可以使用并可选择修改模块

变量''gname'',所以我在函数中声明''global gname'',但当

被修改时它不会被修改。


gname =''苏''

def doIt(name = gname):

global gname

gname = name

print''doIt name'',name,''gname'',gname


print''start gname'',gname

doIt()

doIt(name =''Lisa'')

doIt()

打印''完成gname'',gname


给...

start gname Sue

doIt name Sue gname Sue

doIt name Lisa gname Lisa

doIt name Sue gname Sue

完成gname Sue


变量gname已恢复为值''苏''


奇怪的是,无线在第三次doIt()调用中,它有效...

print''start gname'',gname

doIt()

doIt (name =''Lisa'')

#doIt()

打印''完成gname'',gname


给...

start gname Sue

doIt name Sue gname Sue

doIt name Lisa gname Lisa

完成gname Lisa


变量gname已被修改为''Lisa''


任何想法如何制作''Lisa''永远在第二次永久分配

doIt?谢谢


(注意:Contrived示例替代了Web类型的应用程序,如果在没有参数的情况下调用

页面,则显示全局默认值。

如果使用表单参数调用页面,那么它应该能够

更改全局默认值)

解决方案

meridian写道:


我以为我已经''得到''全局,但这个看起来很奇怪。

我希望我的示例函数''doIt''使用并可选地修改模块

变量''gname'',所以我在函数中声明''global gname'',但是当

修改它不会保持修改。


gname =''苏''

def doIt(name = gname ):



这是一个FAQ,cf:
htt p://www.python.org/doc/faq/genera...etween-objects


简要说明:默认args只在加载时被评估一次/导入时间。


任何想法如何让'Lisa'作业永远永久永久地在第二个

doIt ?谢谢



def doIt(name = None):

global gname

如果名称为None:

name = gname

else:

gname = name


(注意.Contrived示例替换为web类型的应用程序,如果在没有参数的情况下调用

页面,则显示全局默认值。

如果使用表单参数调用页面,则它应该能够

更改全局默认值)



从函数中修改全局变量通常是一个非常糟糕的主意。

-

bruno desthuilliers

python -c" print''@''。join([''。''。join([w p.split(''。'')中的w的[:: - 1]])''o **** @ xiludom.gro'中的

p。分裂(''@ '')])"




Bruno Desthuilliers写道:


def doIt(name = None):

全球gna我是

如果名字是无:

name = gname

else:

gname = name



谢谢Bruno,工作待遇...


meridian写道:


Bruno Desthuilliers写道:


>> def doIt(name = None):
global gname
如果名称为无:
name = gname
否则:
gname = name




感谢Bruno,作品一种享受...



但仍然很可能是一个坏主意。


-

bruno desthuilliers

python -c" print''@''。join([''。''。join([w [:: - 1] for p in p.split(' '。'')])''o **** @ xiludom.gro'中的

p。分裂(''@'')])"


I thought I had ''got'' globals but this one seems strange.
I want my example function ''doIt'' to use and optionally modify a module
variable ''gname'', so I declare ''global gname'' in the function, but when
modified it doesn''t stay modified.

gname = ''Sue''
def doIt(name = gname):
global gname
gname = name
print ''doIt name'', name, ''gname'', gname

print ''start gname'', gname
doIt()
doIt(name=''Lisa'')
doIt()
print ''finish gname'', gname

gives...
start gname Sue
doIt name Sue gname Sue
doIt name Lisa gname Lisa
doIt name Sue gname Sue
finish gname Sue

The variable gname has reverted back to value ''Sue''

Curiously though, without the third doIt() call, it works...
print ''start gname'', gname
doIt()
doIt(name=''Lisa'')
#doIt()
print ''finish gname'', gname

gives...
start gname Sue
doIt name Sue gname Sue
doIt name Lisa gname Lisa
finish gname Lisa

The variable gname has been modified to ''Lisa''

Any ideas how I can make the ''Lisa'' assignment permanent forever in 2nd
doIt? Thanks

(Note. Contrived example substitutes for a web-type app, where, if the
page is called without arguments then it displays the global defaults.
If the page is called with form arguments then it should be able to
change the global defaults)

解决方案

meridian wrote:

I thought I had ''got'' globals but this one seems strange.
I want my example function ''doIt'' to use and optionally modify a module
variable ''gname'', so I declare ''global gname'' in the function, but when
modified it doesn''t stay modified.

gname = ''Sue''
def doIt(name = gname):

This is a FAQ, cf:
http://www.python.org/doc/faq/genera...etween-objects

Briefly : default args are eval''d only once at load/import time.

Any ideas how I can make the ''Lisa'' assignment permanent forever in 2nd
doIt? Thanks

def doIt(name=None):
global gname
if name is None:
name = gname
else:
gname = name

(Note. Contrived example substitutes for a web-type app, where, if the
page is called without arguments then it displays the global defaults.
If the page is called with form arguments then it should be able to
change the global defaults)

Modifying globals from within a function is usually a very bad idea.
--
bruno desthuilliers
python -c "print ''@''.join([''.''.join([w[::-1] for w in p.split(''.'')]) for
p in ''o****@xiludom.gro''.split(''@'')])"



Bruno Desthuilliers wrote:

def doIt(name=None):
global gname
if name is None:
name = gname
else:
gname = name

Thanks Bruno, works a treat...


meridian wrote:

Bruno Desthuilliers wrote:

>>def doIt(name=None):
global gname
if name is None:
name = gname
else:
gname = name



Thanks Bruno, works a treat...

But still very probably a bad idea.

--
bruno desthuilliers
python -c "print ''@''.join([''.''.join([w[::-1] for w in p.split(''.'')]) for
p in ''o****@xiludom.gro''.split(''@'')])"


这篇关于我以为我会'全球'但......的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆