标签: local-variables

在某些情况下,Python 2.6会自动将函数定义中的变量全局变为?为什么?

我完全不知道为什么会发生以下情况:

这是我的代码:


def add_one(array):

    new_array = array
    length = len(array)

    for i in range(length):

        new_array[i] = new_array[i]+1


    return new_array

x = [1,2,3,4,5];
y = add_one(x)

print x

print y
Run Code Online (Sandbox Code Playgroud)

结果如下:

[2, 3, 4, 5, 6]

[2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

我不明白为什么x被改变了.

我的推测:不知何故,x作为函数add_one的全局变量给出.我包含'new_array = array',这样如果数组不知何故是全局变量x,x就不会被改变.但是,当'new_array = array'被执行时,不知何故new_array也变成了全局变量x.我写了一个替代版本的函数add_one,它没有给我带来问题:


def add_one(array):

    new_array = []
    length = len(array)

    for i in range(length):
        new_array.append(array[i]+1)
Run Code Online (Sandbox Code Playgroud)

似乎局部变量(即数组)是由函数中的索引编辑的,它相对于作为该函数输入的全局变量变为全局变量?

我不知道发生了什么事.任何解释都将受到高度赞赏.

python debugging global-variables local-variables issue-tracking

1
推荐指数
1
解决办法
326
查看次数

使用do-file和本地宏

我在使用do带有本地宏的文件时在Stata中收到以下错误:

clear 
capture log close

sysuse auto,clear 
log using stata,text replace

local varlist  price mpg rep78 weight length
reg 'varlist'
local close
Run Code Online (Sandbox Code Playgroud)

产量

local varlist  price mpg rep78 weight length

reg 'varlist'
invalid name
Run Code Online (Sandbox Code Playgroud)

我知道这是一个非常微不足道的问题,但我不确定这个错误来自何处.

请注意,当我使用全局宏时,我没有收到错误.

global-variables local-variables stata stata-macros

1
推荐指数
1
解决办法
1759
查看次数

无法调用在父作用域中分配的局部变量

blah = 10
def what?
  "#{blah}"
end
puts what?
# =>
# NameError: undefined local variable or method `blah' for main:Object
#     from (irb):3:in `what?'
#     from (irb):5
#     from E:/RailsInstaller/Ruby1.9.3/bin/irb:12:in `<main>`
Run Code Online (Sandbox Code Playgroud)

为什么?正确的写法是什么?我应该在局部范围内复制一个变量还是有更好的变体?

ruby scope local-variables

1
推荐指数
1
解决办法
1368
查看次数

如何在Stata中减去两个包含变量名的本地宏?

假设您有一个保存在本地宏中的变量名称列表 A、B、C、D、E:

loc l1 "A B C D E"
Run Code Online (Sandbox Code Playgroud)

您还有一个不同的变量名称列表 A,C 保存在不同的宏中:

loc l2 "A C"
Run Code Online (Sandbox Code Playgroud)

您将如何获得这些(即变量名称 B、D、E 列表)的(集合)差异?

local-variables stata

1
推荐指数
1
解决办法
2642
查看次数

修改了Python局部变量但最后没有显示

a = 'file'
b = 'file'
c = 4
d = 4
e = 5
f = 6

def sim(a,b,c,d,e,f):
    s = 0
    if( a == b):
        s+=1
        print(s)
    if( c==d ):
        s+=1
        print(s)
    if (e == d):
        s+=1
        print(s)
    score = s/3
    return score

>>> sim(a,b,c,d,e,f)
Run Code Online (Sandbox Code Playgroud)

以上输出是:

1
2
0
Run Code Online (Sandbox Code Playgroud)

这意味着虽然s首先更新了if子句,当它在score变量中被访问时,它具有s的旧值,即0.有人可以解释如何纠正这个吗?为什么没有显示s的正确值来得分变量

python if-statement local-variables

1
推荐指数
1
解决办法
53
查看次数

在C#中使用"不必要的"局部变量的性能损失?

使用额外的局部变量存储方法的结果时是否存在性能损失?

public string void ToFunkyDutchDate(DateTime this theDate) {
    var result = string.Format("{0:dd-MM-yyyy}", theDate);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

在类似的琐碎案例中,我甚至可以立即返回格式化的字符串.但这只是一个简单的例子,因为在一些更复杂的函数中,我经常使用这个"技巧"将结果首先分配给临时局部变量.

我的主要原因是这样可以更轻松地进行调试.我可以在线上放一个断点return result;,运行并检查我的函数出现的结果是否正确.

但额外的临时result变量仍然感觉有点像无法使用的替代品而没有:"

public static string ToFunkyDutchDate(DateTime this theDate) {
    return string.Format("{0:dd-MM-yyyy}", theDate);
}
Run Code Online (Sandbox Code Playgroud)

我用三种方式缓解了这种唠叨的感觉:

  • 任何性能下降都是可以忽略的
  • 拥有一个变量result会使代码更容易理解return very long multi-line expression,这会使性能下降更糟糕
  • 如果C-sharp的编译器在任何地方都是不错的 - 我认为它是 - 那么它应该编译额外的变量.例如,使得结果字节码与函数在不使用临时变量的情况下立即返回计算结果完全相同.立即(当不在调试模式下运行时) - 或者可能在进行优化/生成构建(/optimize+)时.

但是我已经这么做了很多年了,在如此多的代码行中,我想我最后会问它.这里的任何编译器向导都知道吗?:)

编辑:一分钟内回答一个已经酝酿多年的问题.Stackoverflow有多棒.伟大的工具:http://tryroslyn.azurewebsites.net/

c# performance local-variables compiler-optimization

1
推荐指数
1
解决办法
429
查看次数

有没有办法获得指向Julia变量的集合?

让我们假设我有3个变量R1,R2和R3.我想要一个指向变量的Dictionary(或其他集合),这样如果我修改变量,它也会改变Dictionary中的值.

基本上我想做这样的事情:

R1 = 0.0
R2 = 0.0
R3 = 0.0

D = Dict(1=>R1, 2=>R2, 3=>R3)

D[1]
output> 0.0

R1 = 1.0

D[1]
output> 1.0
Run Code Online (Sandbox Code Playgroud)

在朱莉娅有办法做到这一点吗?

谢谢

collections pointers local-variables julia

1
推荐指数
1
解决办法
71
查看次数

静态分配的数组如何在 C 中的内存中布局?

我正在尝试使用指向另一个 var 的指针来操纵一个 var 的值的指针,这基于本地 vars 通常如何在 C 程序中堆叠。

int i = 30;
int arr[4];

printf("%d\n", *(arr - 5)); // 30
Run Code Online (Sandbox Code Playgroud)
int arr[4];
int i = 30;

printf("%d\n", *(arr - 5)); // also 30
Run Code Online (Sandbox Code Playgroud)

我认为后者应该打印 30 for *(arr + 5),因为这就是我认为本地变量被推入堆栈的方式,但变量似乎以相同的方式在内存中布置。我想了解这里发生了什么。另外,我假设这是依赖于系统/编译器的。

c local-variables memory-layout

1
推荐指数
1
解决办法
68
查看次数

如何避免在 const 自动对象过去占用的存储中创建任何对象?

C++(草案)标准包含我所说的“ROMability 条款”,即[basic.life]/10

在具有静态、线程或自动存储持续时间的 const 完整对象占用的存储中,或在此类 const 对象在其生命周期结束之前曾经占用的存储中创建新对象,将导致未定义的行为。

第一部分很好:“静态,线程”“存储持续时间”。允许重复使用这种存储是不合理的。

但是最后一部分呢:

自动存储持续时间占用,或在此类 const 对象在其生命周期结束之前曾经占用的存储空间内

这是否意味着用户需要避免在堆栈可能已使用的任何内存位置创建任何对象(用于存储自动对象)

这将阻止在自动对象的任何子对象上使用新放置,或使用执行此类操作的库工具。

这是零意义的,但在我看来,它确实是这里指定的内容。

c++ constants local-variables placement-new language-lawyer

1
推荐指数
1
解决办法
80
查看次数

Stack中的局部变量及其在C程序中的使用顺序

在 C 程序中,局部变量存储在堆栈中。让我们说在那里定义了局部变量。

int x, y, z;
Run Code Online (Sandbox Code Playgroud)

这意味着首先将“x”压入堆栈,然后是“y”,然后是“z”。现在,如果我需要在 'y' 或 'z' 之前使用 'x' 变量,那么这意味着我必须先弹出 'y' 和 'z',然后才能访问堆栈上的 'x' 变量。

我的理解是正确的还是遗漏了什么?

c stack local-variables

1
推荐指数
1
解决办法
59
查看次数