Check out `product()`

in the `itertools`

module. It does exactly what you describe.

```
import itertools
my_list = [1,2,3,4]
for pair in itertools.product(my_list, repeat=2):
foo(*pair)
```

This is equivalent to:

```
my_list = [1,2,3,4]
for x in my_list:
for y in my_list:
foo(x, y)
```

**Edit:** There are two very similar functions as well, `permutations()`

and `combinations()`

. To illustrate how they differ:

`product()`

generates every possible pairing of elements, including all duplicates:

```
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4
```

`permutations()`

generates all unique orderings of each unique pair of elements, eliminating the `x,x`

duplicates:

```
. 1,2 1,3 1,4
2,1 . 2,3 2,4
3,1 3,2 . 3,4
4,1 4,2 4,3 .
```

Finally, `combinations()`

only generates each unique pair of elements, in lexicographic order:

```
. 1,2 1,3 1,4
. . 2,3 2,4
. . . 3,4
. . . .
```

All three of these functions were introduced in Python 2.6.