Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 分配给函数调用,如C++;11 C++中允许返回一个值的引用,然后写入到IS,例如: #include <iostream> int main() { int data[] = {1,2,3,4}; std::cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << '\n'; auto key = [](int data[]) -> int & { return data[1]; }; key(data) = 6; std::cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << '\n'; }_Python_Python 3.x_Lambda - Fatal编程技术网

Python 分配给函数调用,如C++;11 C++中允许返回一个值的引用,然后写入到IS,例如: #include <iostream> int main() { int data[] = {1,2,3,4}; std::cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << '\n'; auto key = [](int data[]) -> int & { return data[1]; }; key(data) = 6; std::cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << '\n'; }

Python 分配给函数调用,如C++;11 C++中允许返回一个值的引用,然后写入到IS,例如: #include <iostream> int main() { int data[] = {1,2,3,4}; std::cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << '\n'; auto key = [](int data[]) -> int & { return data[1]; }; key(data) = 6; std::cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << '\n'; },python,python-3.x,lambda,Python,Python 3.x,Lambda,同时,在Python 3中: data = (1,2,3,4) key = lambda d: d[2] key(data) = 5 print(data) 这是可行的,但并不令人满意,因为它很好地说明了我可能不会分配给函数调用: File "gett.py", line 4 key(data) = 5 ^ SyntaxError: can't assign to function call 那么,我如何传递一个既可用于获取也可用于设置的callable呢?Python3

同时,在Python 3中:

data = (1,2,3,4)
key = lambda d: d[2]
key(data) = 5
print(data)
这是可行的,但并不令人满意,因为它很好地说明了我可能不会分配给函数调用:

  File "gett.py", line 4
    key(data) = 5
    ^
SyntaxError: can't assign to function call
那么,我如何传递一个既可用于获取也可用于设置的callable呢?Python3是如何做到这一点的

我的特殊用例是我有这样的东西:

#Data = namedtuple('Data',    ['meta', 'value', 'othervalue'])
# since namedtuples are not muteable

class Data:
  def __init__(self, meta, value, othervalue):
    self.meta = meta; self.value=value; self.othervalue=othervalue;

data = [Data('blabla', None, 543), Data('blabla', 5, 54), Data('blabla', 324, None), Data('blabla', None, 34), Data('blabla', 432, None)]
def nearest_before_interpolate(self, l, key):
  last = 0
  for i in range(len(l)):
    with getattr(l[i], key) as val:
      if val == None:
        setattr(l[i], key, last)
      else:
        last = val
其中,我希望将每个
None
替换为
value
othervalue
的先前值,如下所示:

#Data = namedtuple('Data',    ['meta', 'value', 'othervalue'])
# since namedtuples are not muteable

class Data:
  def __init__(self, meta, value, othervalue):
    self.meta = meta; self.value=value; self.othervalue=othervalue;

data = [Data('blabla', None, 543), Data('blabla', 5, 54), Data('blabla', 324, None), Data('blabla', None, 34), Data('blabla', 432, None)]
def nearest_before_interpolate(self, l, key):
  last = 0
  for i in range(len(l)):
    with getattr(l[i], key) as val:
      if val == None:
        setattr(l[i], key, last)
      else:
        last = val
现在,我将键作为字符串传递,但如果这是一个通用的
lambda
,它可以以它认为合适的任何方式提取正确的字段,那就太好了(这并不是说它真的需要那种灵活性,但我更喜欢
lambda
s,而不是我猜的字符串,也更适合这个用例)


有人对如何做有好的建议吗?

这里有两个问题:

  • python语法不允许直接赋值给函数调用的返回值-
    不能赋值给函数调用
    。就这么简单

  • 元组是不可变的,所以不能替换项,只能更改其值。在你的例子中,这显然是个问题,你不能改变一个数字的值。。五等于五

为了解决这些问题,这里有一个概念证明:

data = ([1],[2],[3],[4])
key = lambda d: d[2]
v = key(data)
v.append(0)
print(data)  # ([1], [2], [3, 0], [4])

更新:抱歉,我有点困惑,因为您使用的是元组,而不是列表

嗯,您几乎可以做到这一点,只是不需要使用您想要的语法:

class wrapper():
   def __init__(self, d, i):
     self.d = d
     self.i = i
   def set(self, v):
     self.d[self.i] = v

data = [1,2,3,4]
key = lambda d: wrapper(d, 2)
v = key(data)
v.set(5)
print(data)  # [1, 2, 5, 4]

在python中,不能重载赋值,因此需要其他方法来更改值。在这里,我选择了一个函数调用,但您可以使用任何可以使用的功能(例如:设置属性)。

我认为这是在没有重大黑客攻击的情况下最接近的功能:

class Data(object):

    def __init__(self, meta, value, othervalue):
        self.meta = meta
        self.value = value
        self.othervalue = othervalue

    def __getitem__(self, key):
        return getattr(self, key)

    def __setitem__(self, key, value):
        setattr(self, key, value)


d = Data('blabla', None, 543)
print d.value                       # None
d['value'] = 321
print d.value                       # 321

元组是不可变的,因此你的简化示例没有意义。区别在于C++允许函数返回一些可以被分配给python的东西,所以它根本没有意义。> [2 ]=5回溯(最近调用最后):文件“,”行1,在Type Error:“tuple”对象不支持项目赋值,here键返回一个列表,您可以在其中追加和更改,但不能用其他内容覆盖整个列表,例如。我认为,只有当key返回一个类似指针的类型,比如一个列表,而不是该列表的一个元素时,这才有效;键=λx:x[1];v=键(数据);v=5;打印(数据)结果[1,2,3,4]只要你不做作业,它可以处理任何可变的东西。您的示例有点混乱(tuple vs list),给我一些时间…hrrmrr:(您更新的解决方案有点java风格,特别是因为您还可以使用一个不是真正透明的包装器对象(如c++11中的代理)。谢谢您的努力。我的问题不仅限于列表,也不限于元组,它应该适用于您可以在python中存储的任何内容。一般来说,您可以了解如何在python中存储可写引用,而您的包装类基本上试图将其用于列表。我恐怕(或者更高兴)语言中没有任何东西支持这一点。一旦您从容器中获得一个元素,您就已经离开了容器的领域……这将是大量的样板代码,而且,我可能希望在某一时刻为数据类型使用一种访问类型,在另一时刻为另一种访问类型。如果您想要分离getter和setter,它将最好传递一个get lambda和一个set lambda,而不是您的OO实现,因为get和set实现应该按调用定义,而不是按类型定义。@Herbert我不想将它们分开,只是正如其他人指出的那样,没有办法解决这个问题。您可以编写一个实例化的通用包装器类d带有get lambda和set lambda(或任何其他类型的逻辑),并提供适当的
\uuuuu getitem\uuuuuuuu
\uuuuuu setitem\uuuuuu