我在Robot Framework中使用自己的python函数。我给出3个参数,这些参数是Robot Framework变量。当我修改函数中的变量时,它不会在Robot Framework中修改。所以我推断变量是通过值而不是通过引用传递的...有没有办法通过引用传递变量?或者返回3个变量作为结果?
以下是Robot Framework代码的示例:
** Settings ***
Library OperatingSystem
Library myLib.MyLib WITH NAME MyLib
Suite TearDown teardown
** Variables **
${var} azerty
** Test Cases **
My test case
log ${var}
myFunction ${var}
log ${var}
使用我的python库:
import sys
class MyLib(object):
def __init__(self):
return
def myFunction(self,var):
var="another value"
但正如我所说,变量var在我记录时仍然是“azerty”,我希望第二个日志打印“另一个值”(因为函数应该更改值)
感谢您的帮助!
答案 0 :(得分:3)
所有值基本上都是通过引用传递的。如果更改了值,则会在任何地方更改它,但如果为变量指定了不同的值,则只需将该变量指向不同的值,而不是更改原始值。
例如:
def foo(d):
d['bar'] = 'baz'
my_dict = {}
foo(my_dict)
此处,my_dict
将被更改为调用foo(my_dict)
的副作用。
然而:
def foo(d):
d = {'foo': 'bar'}
my_dict = {}
foo(my_dict)
此处my_dict
未发生变化。 d
是foo
内的局部变量,并且已更改为指向新词典而非my_dict
。
您还需要注意,在python中,您有可变和不可变值。例如,字符串是不可变的。您永远无法更改字符串,您只能使用字符串来构造新字符串(通常您会将这些新值分配回同一个变量,因此它会产生类似的效果);具有函数的副作用是改变传入的值之一只有在它们是可变值的情况下才能起作用。
虽然你的函数改变他们的论点通常是一个坏主意。更好的方法是让它们返回新的值,然后调用者可以按照自己的意愿执行操作。
def myFunction(self, var):
var = "another value" # I assume that another values is based somehow on the original
return var
或者,您可以在班级中使用属性:
class MyLib(object):
def __init__(self):
self.var = "initial value"
def myFunction(self):
self.var = "another value"
答案 1 :(得分:0)
你的python代码中的var是一个局部变量。
import sys
class MyLib(object):
def __init__(self):
return
def myFunction(self,var):
var="another value"
这为myfunction范围中的变量提供了名称var,并防止读取全局变量。 如果您希望函数更改全局变量,则需要在范围中将其声明为全局变量。 像这样:
import sys
class MyLib(object):
def __init__(self):
return
def myFunction(self,var):
global var
var="another value"
这应该将全局变量更改为另一个值字符串。