# Python 全局，局部和非局部变量

> 原文： [https://www.programiz.com/python-programming/global-local-nonlocal-variables](https://www.programiz.com/python-programming/global-local-nonlocal-variables)

#### 在本教程中，您将了解 Python 全局变量，局部变量，非局部变量以及在何处使用它们。

## 全局变量

在 Python 中，在函数外部或全局范围内声明的变量称为全局变量。 这意味着可以在函数内部或外部访问全局变量。

让我们看一下如何在 Python 中创建全局变量的示例。

### 示例 1：创建一个全局变量

```py
x = "global"

def foo():
    print("x inside:", x)

foo()
print("x outside:", x)
```

**输出**

```py
x inside: global
x outside: global
```

在上面的代码中，我们创建了`x`作为全局变量，并定义了`foo()`以打印全局变量`x`。 最后，我们称为`foo()`，它将打印`x`的值。

如果要在函数内更改`x`的值怎么办？

```py
x = "global"

def foo():
    x = x * 2
    print(x)

foo()
```

**输出**：

```py
UnboundLocalError: local variable 'x' referenced before assignment
```

输出显示错误，因为 Python 将`x`视为局部变量，而`x`也未在`foo()`内部定义。

为此，我们使用`global`关键字。 访问 [Python `global`关键字](/python-programming/global-keyword)了解更多信息。

* * *

## 局部变量

在函数体内或局部范围内声明的变量称为局部变量。

### 示例 2：访问范围之外的局部变量

```py
def foo():
    y = "local"

foo()
print(y)
```

**输出**：

```py
NameError: name 'y' is not defined
```

输出显示错误，因为我们试图在全局范围内访问局部变量`y`，而局部变量仅在`foo()`或局部范围内起作用。

* * *

让我们看一个有关如何在 Python 中创建局部变量的示例。

### 示例 3：创建局部变量

通常，我们在函数内部声明一个变量以创建局部变量。

```py
def foo():
    y = "local"
    print(y)

foo()
```

**输出**：

```py
local
```

让我们看一下[较早的问题](#change-x)，其中`x`是全局变量，我们想在`foo()`内部修改`x`。

* * *

## 全局和局部变量

在这里，我们将展示如何在同一代码中使用全局变量和局部变量。

### 示例 4：在同一代码中使用全局变量和局部变量

```py
x = "global "

def foo():
    global x
    y = "local"
    x = x * 2
    print(x)
    print(y)

foo()
```

**输出**：

```py
global global 
local
```

在上面的代码中，我们在`foo()`中将`x`声明为全局变量，并将`y`声明为局部变量。 然后，我们使用乘法运算符`*`修改全局变量`x`，并打印`x`和`y`。

调用`foo()`后，`x`的值变为`global global`，因为我们使用`x * 2`打印两次`global`。 之后，我们打印局部变量`y`的值，即`local`。

* * *

### 示例 5：具有相同名称的全局变量和局部变量

```py
x = 5

def foo():
    x = 10
    print("local x:", x)

foo()
print("global x:", x)
```

**输出**：

```py
local x: 10
global x: 5
```

在上面的代码中，我们为全局变量和局部变量使用了相同的名称`x`。 当我们打印相同的变量时，我们会得到不同的结果，因为在两个范围内都声明了变量，即`foo()`内的局部作用域和`foo()`之外的全局作用域。

当我们在`foo()`中打印变量时，它输出`local x: 10`。 这称为变量的局部作用域。

类似地，当我们在`foo()`外部打印变量时，它将输出`global x: 5`。 这称为变量的全局范围。

* * *

## 非局部变量

非局部变量用于未定义局部范围的嵌套函数中。 这意味着该变量不能位于本地范围或全局范围内。

让我们来看一个如何在 Python 中创建全局变量的示例。

我们使用`nonlocal`关键字创建非局部变量。

### 示例 6：创建一个非局部变量

```py
def outer():
    x = "local"

    def inner():
        nonlocal x
        x = "nonlocal"
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
```

**输出**：

```py
inner: nonlocal
outer: nonlocal
```

在上面的代码中，有一个嵌套的`inner()`函数。 我们使用`nonlocal`关键字创建一个非局部变量。`inner()`函数在另一个函数`outer()`的范围内定义。

**注意**：如果我们更改非局部变量的值，则更改将显示在局部变量中。